// 未入力の場合、true
const none = (value) => {
  return value === null || value === undefined || value === '';
};

/**
 * 入力チェックユーティリティクラス
 */
export default class {

  /**
   * 必須入力チェック
   * @param {string|number} value 入力値
   * @return {boolean} true:入力あり, false:入力なし
   */
  static required(value) {
    return !none(value) && /^./.test(value);
  }

  /**
   * 数値（正の整数）チェック
   * @param {string} value 入力値
   * @return {boolean} true:数値である or 未入力, false:数値でない
   */
  static digit(value) {
    return none(value) || /^\d+$/.test(value);
  }

  /**
   * 数値範囲チェック（境界値含む）
   * @param {string|number} value 入力値
   * @param {number} min 最小値（境界含む）
   * @param {number} max 最大値（境界含む）
   * @return {boolean} true:数値範囲内 or 未入力, false:数値範囲外
   */
  static rangeEqual(value, min, max) {
    return none(value) || (value >= min && value <= max);
  }

  /**
   * 選択値チェック
   * @param {number} value 入力値
   * @param {Array.<number>=} somes 選択値定義
   * @return {boolean} true:選択値定義あり or 未入力, false:選択値定義なし
   */
  static oneOf(value, somes = []) {
    return none(value) || somes.includes(value);
  }

  /**
   * 最大文字数（最大桁数）チェック
   * @param {string|number} value 入力値
   * @param {number} size 最大文字数（最大桁数）
   * @return {boolean} true:最大文字数以下 or 未入力, false:最大文字数超過
   */
  static maxLength(value, size) {
    return none(value) || String(value).length <= size;
  }

}
